{"componentChunkName":"component---src-templates-blog-post-js","path":"/Comic-Book-App-With-Marvel-API-and-React/","result":{"data":{"site":{"siteMetadata":{"title":"Aleks Popovic - personal website and blog"}},"markdownRemark":{"id":"5c8d15d5-d5a8-55aa-bb8b-355388d3e29f","excerpt":"I grew up on both DC and Marvel comic books, cartoons and TV shows. From the 1966 Batman series, to 1967 Spider man cartoons, and 1940s Superman cartoons, which…","html":"<p>I grew up on both DC and Marvel comic books, cartoons and TV shows. From the 1966 Batman series, to 1967 Spider man cartoons, and 1940s Superman cartoons, which were super old even in the 90s, but I guess that’s what our TV companies could afford at the time.</p>\n<p>Nowadays if I want to read a comic book I have no idea where to even begin. There are so many different characters, storylines and multiverses which may or may not be connected. Which got me thinking - what if I had a searchable comic book library where I could enter a character’s name and I would get all of their comic books from which I can pick and choose what to read?</p>\n<p>The original idea was to make it searchable by both Marvel and DC characters but DC doesn’t seem to have an official public API while Marvel does, so that will have to do for this project. For more general superhero information you can also use superheroAPI, but to get the comic book data we will use <a href=\"https://developer.marvel.com/\" target=\"_blank\" rel=\"noreferrer\">Marvel’s official API</a>. Before starting you should make sure you have set up your Marvel developer account and you have access to your private and public API keys, as we will need those later.</p>\n<p>If you prefer a video version of this tutorial you can watch me build the comic book library app in React on Youtube:</p>\n<div class=\"gatsby-resp-iframe-wrapper\" style=\"padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem\" > <iframe src=\"https://www.youtube.com/embed/l6-et1iNWMk\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen style=\" position: absolute; top: 0; left: 0; width: 100%; height: 100%; \"></iframe> </div>\n<p>I started a new React app through <a href=\"https://vitejs.dev/\" target=\"_blank\" rel=\"noreferrer\">Vite</a> by running:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">yarn create vite</code></pre></div>\n<p>If you don’t use yarn you can find detailed scaffolding instructions on <a href=\"https://vitejs.dev/guide/#scaffolding-your-first-vite-project\" target=\"_blank\" rel=\"noreferrer\">Vite’s Getting Started page</a>.</p>\n<p>For this project we are going to use two additional packages - sass for writing Sass, and md5 for hashing one of the parameters for our API request. To install them run:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">yarn add sass md5</code></pre></div>\n<p>We are also going to use a couple of images in our styling which you can grab <a href=\"https://github.com/alekspopovic/marvel/tree/main/comic-library/src/images\" target=\"_blank\" rel=\"noreferrer\">from my GitHub repo</a>. Make sure to put them in your <code class=\"language-text\">/src/images</code> folder.</p>\n<p>Final peace of setup that you need to do before continuing is configuring your environment variables. If you are working with Vite like me you need to create a new file called <code class=\"language-text\">.env.local</code> in your project’s root and add these two properties to it.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token constant\">VITE_PUBLIC_KEY</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"YOUR_PUBLIC_KEY\"</span>\n<span class=\"token constant\">VITE_PRIVATE_KEY</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"YOUR_PRIVATE_KEY\"</span></code></pre></div>\n<p>Make sure to replace the strings with your actual public and private keys from the Marvel’s developer portal. Your variables need to be prefixed with <code class=\"language-text\">VITE_</code>, so make sure to not remove that part. After that you can proceed with creating components.</p>\n<p>To start off I made a new folder called <code class=\"language-text\">components</code> and in there I added a new component called <code class=\"language-text\">Search.jsx</code> and imported it into <code class=\"language-text\">App.jsx</code>. Here is what the <code class=\"language-text\">App.jsx</code> looks like.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// App.js</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token string\">\"./App.css\"</span>\n<span class=\"token keyword\">import</span> Search <span class=\"token keyword\">from</span> <span class=\"token string\">\"./components/Search\"</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">App</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>App<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Search</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> App</code></pre></div>\n<p>The main purpose of the app is to be able to search comic book characters by their name. Once we select a character we should get a list of their comic books and clicking on a comic book should show us more details about that specific comic book.</p>\n<p>Most of our app’s logic is going to happen in the Search component, so here is what it should look like.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// Search.jsx</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token string\">\"../styles/Search.scss\"</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span>\n<span class=\"token keyword\">import</span> md5 <span class=\"token keyword\">from</span> <span class=\"token string\">\"md5\"</span>\n<span class=\"token keyword\">import</span> Characters <span class=\"token keyword\">from</span> <span class=\"token string\">\"./Characters\"</span>\n<span class=\"token keyword\">import</span> Comics <span class=\"token keyword\">from</span> <span class=\"token string\">\"./Comics\"</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">Search</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>characterName<span class=\"token punctuation\">,</span> setCharacterName<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>characterData<span class=\"token punctuation\">,</span> setCharacterData<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>comicData<span class=\"token punctuation\">,</span> setComicData<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">const</span> publicKey <span class=\"token operator\">=</span> <span class=\"token keyword\">import</span><span class=\"token punctuation\">.</span>meta<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">VITE_PUBLIC_KEY</span>\n  <span class=\"token keyword\">const</span> privateKey <span class=\"token operator\">=</span> <span class=\"token keyword\">import</span><span class=\"token punctuation\">.</span>meta<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">VITE_PRIVATE_KEY</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handleSubmit</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    event<span class=\"token punctuation\">.</span><span class=\"token function\">preventDefault</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">getCharacterData</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">getCharacterData</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">setCharacterData</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">setComicData</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">const</span> timeStamp <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getTime</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">const</span> hash <span class=\"token operator\">=</span> <span class=\"token function\">generateHash</span><span class=\"token punctuation\">(</span>timeStamp<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">const</span> url <span class=\"token operator\">=</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">https://gateway.marvel.com:443/v1/public/characters?apikey=</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>publicKey<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&amp;hash=</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>hash<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&amp;ts=</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>timeStamp<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&amp;nameStartsWith=</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>characterName<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&amp;limit=100</span><span class=\"token template-punctuation string\">`</span></span>\n\n    <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">response</span> <span class=\"token operator\">=></span> response<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">result</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">setCharacterData</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">)</span>\n        console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"There was an error:\"</span><span class=\"token punctuation\">,</span> error<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">getComicData</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">characterId</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    window<span class=\"token punctuation\">.</span><span class=\"token function\">scrollTo</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> top<span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> left<span class=\"token operator\">:</span> <span class=\"token number\">0</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">const</span> timeStamp <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getTime</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">const</span> hash <span class=\"token operator\">=</span> <span class=\"token function\">generateHash</span><span class=\"token punctuation\">(</span>timeStamp<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">const</span> url <span class=\"token operator\">=</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">https://gateway.marvel.com:443/v1/public/characters/</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>characterId<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">/comics?apikey=</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>publicKey<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&amp;hash=</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>hash<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&amp;ts=</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>timeStamp<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span>\n\n    <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">response</span> <span class=\"token operator\">=></span> response<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">results</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">setComicData</span><span class=\"token punctuation\">(</span>results<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">)</span>\n        console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>results<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Error while fetching comic data\"</span><span class=\"token punctuation\">,</span> error<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">generateHash</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">timeStamp</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token function\">md5</span><span class=\"token punctuation\">(</span>timeStamp <span class=\"token operator\">+</span> privateKey <span class=\"token operator\">+</span> publicKey<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handleChange</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">setCharacterName</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handleReset</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">setCharacterData</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">setComicData</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">setCharacterName</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>form</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>search<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">onSubmit</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>handleSubmit<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>input</span>\n          <span class=\"token attr-name\">placeholder</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>ENTER CHARACTER NAME<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>text<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token attr-name\">onChange</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>handleChange<span class=\"token punctuation\">}</span></span>\n        <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>buttons<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>submit<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Get character data</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>reset<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>reset<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>handleReset<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n            Reset\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>form</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n\n      </span><span class=\"token punctuation\">{</span><span class=\"token operator\">!</span>comicData <span class=\"token operator\">&amp;&amp;</span> characterData <span class=\"token operator\">&amp;&amp;</span> characterData<span class=\"token punctuation\">.</span>results<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token punctuation\">(</span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Characters</span></span> <span class=\"token attr-name\">data</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>characterData<span class=\"token punctuation\">.</span>results<span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>getComicData<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span>\n      <span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n\n      </span><span class=\"token punctuation\">{</span>comicData <span class=\"token operator\">&amp;&amp;</span> comicData<span class=\"token punctuation\">.</span>results<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Comics</span></span> <span class=\"token attr-name\">data</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>comicData<span class=\"token punctuation\">.</span>results<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The Search component might look a bit daunting but in essence it’s not too complicated. We have a submittable form with an input text field and a few buttons. The input has an <code class=\"language-text\">onChange</code> event that is calling the <code class=\"language-text\">handleChange</code> function which is a very simple function in which we set the character’s name through <code class=\"language-text\">useState</code>.</p>\n<p>Submitting the form or clicking the submit button will call the <code class=\"language-text\">handleSubmit</code> function which calls the <code class=\"language-text\">getCharacterData</code> function. In <code class=\"language-text\">getCharacterData</code> we do several things. We reset our state and make a hashed timestamp which we need as one of the API parameters. We are doing this by combining the timestamp with our private and public API keys that we got from the Marvel’s developer portal and passing them into <code class=\"language-text\">md5</code> function which we are importing from the <code class=\"language-text\">md5</code> package.</p>\n<p>If you followed my .env file setup from the beginning you can use your environment variables with <code class=\"language-text\">import.meta.env.VITE_PUBLIC_KEY</code> and <code class=\"language-text\">import.meta.env.VITE_PRIVATE_KEY</code>.</p>\n<p>We are conditionally showing <code class=\"language-text\">Characters</code> and <code class=\"language-text\">Comics</code> component at the bottom. The idea here is that we want to show <code class=\"language-text\">Characters</code> if we have character data. If we have the comic book data then we want to hide <code class=\"language-text\">Characters</code> and show only <code class=\"language-text\">Comics</code>.</p>\n<p>We are passing in <code class=\"language-text\">getComicData</code> function into <code class=\"language-text\">Characters</code> component which is going to be used as an <code class=\"language-text\">onClick</code> event in there. The function is very similar to <code class=\"language-text\">getCharacterData</code>, but we are calling a different endpoint and this time we need the <code class=\"language-text\">characterId</code> as an additional parameter, because we are fetching only that character’s comic books.</p>\n<p>Finally, <code class=\"language-text\">handleReset</code> is used to reset all component state, as its name implies.</p>\n<p>Here is what the <code class=\"language-text\">Characters</code> component looks like.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// Characters.jsx</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token string\">\"../styles/Characters.scss\"</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">Characters</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> data<span class=\"token punctuation\">,</span> onClick <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>characters<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token punctuation\">{</span>data<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">character</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n          <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span>\n            <span class=\"token attr-name\">key</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>character<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">}</span></span>\n            <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>characterCard<span class=\"token punctuation\">\"</span></span>\n            <span class=\"token attr-name\">style</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span>\n              background<span class=\"token operator\">:</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">url(</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>character<span class=\"token punctuation\">.</span>thumbnail<span class=\"token punctuation\">.</span>path<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">.</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>character<span class=\"token punctuation\">.</span>thumbnail<span class=\"token punctuation\">.</span>extension<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">) no-repeat center</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span>\n              backgroundSize<span class=\"token operator\">:</span> <span class=\"token string\">\"cover\"</span><span class=\"token punctuation\">,</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span></span>\n            <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">onClick</span><span class=\"token punctuation\">(</span>character<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span>\n          <span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n            </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>caption<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>character<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n            </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>caption bottom<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">View Comics</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>We are passing our character data and our <code class=\"language-text\">onClick</code> event in there and we are simply mapping everything into character card elements. We are dynamically setting the card background by using an image URL we get from character data.</p>\n<p>We are using two different captions at the bottom. The first one will be visible by default and it displays the character’s name. The second one will be hidden and on mouse hover the character’s name will dissapear and the <code class=\"language-text\">View Comics</code> caption will pop out. We are using this as a way to indicate the cards are clickable. So far both captions are being shown, but we will fix this later in CSS.</p>\n<p>Here is what the <code class=\"language-text\">Comics</code> component looks like.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// Comics.jsx</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token string\">\"../styles/Comics.scss\"</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">Comics</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> data <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>comics<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token punctuation\">{</span>data<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">comic</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">const</span> detailsUrl <span class=\"token operator\">=</span> comic<span class=\"token punctuation\">.</span>urls<span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span>\n          <span class=\"token parameter\">element</span> <span class=\"token operator\">=></span> element<span class=\"token punctuation\">[</span><span class=\"token string\">\"type\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">===</span> <span class=\"token string\">\"detail\"</span>\n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>url\n\n        <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n          <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>a</span>\n            <span class=\"token attr-name\">key</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>comic<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">}</span></span>\n            <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>comicCard<span class=\"token punctuation\">\"</span></span>\n            <span class=\"token attr-name\">style</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span>\n              background<span class=\"token operator\">:</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">url(</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>comic<span class=\"token punctuation\">.</span>thumbnail<span class=\"token punctuation\">.</span>path<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">.</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>comic<span class=\"token punctuation\">.</span>thumbnail<span class=\"token punctuation\">.</span>extension<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">) no-repeat center</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span>\n              backgroundSize<span class=\"token operator\">:</span> <span class=\"token string\">\"cover\"</span><span class=\"token punctuation\">,</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span></span>\n            <span class=\"token attr-name\">href</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>detailsUrl<span class=\"token punctuation\">}</span></span>\n            <span class=\"token attr-name\">target</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>_blank<span class=\"token punctuation\">\"</span></span>\n            <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>noreferrer<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n            </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>caption<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>comic<span class=\"token punctuation\">.</span>title<span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n            </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>caption bottom<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">View Comic Details</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>a</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>This one is similar to <code class=\"language-text\">Characters</code> component with a few key differences. Before mapping out the comic book cards we need to find the URL for each comic on Marvel’s official website. Each comic has a property called <code class=\"language-text\">urls</code> which contains different objects which have two properties - <code class=\"language-text\">type</code> and <code class=\"language-text\">url</code>. The object which has its <code class=\"language-text\">type</code> equal to <code class=\"language-text\">detail</code> contains our URL in its <code class=\"language-text\">url</code> property, so we need to find it and extract it.</p>\n<p>We are then free to map out all comic book elements into comic card links. We are setting their background the same way we did for the <code class=\"language-text\">Comics</code> component and we are also adding two captions, but this time the default one shows the comic book title.</p>\n<p>That is everything as far as our functionalities go. If you want to set up your CSS the same way as I did you can use the following code. Also, make sure to put your <code class=\"language-text\">.scss</code> files into a separate <code class=\"language-text\">styles</code> folder.</p>\n<div class=\"gatsby-highlight\" data-language=\"scss\"><pre class=\"language-scss\"><code class=\"language-scss\"><span class=\"token comment\">// Search.scss</span>\n\n<span class=\"token selector\">.search </span><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> flex<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">flex-direction</span><span class=\"token punctuation\">:</span> column<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">align-items</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">max-width</span><span class=\"token punctuation\">:</span> 500px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> 1em auto<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">input </span><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 300px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 1.4em<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">text-align</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> 1em 0<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">font-family</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"Bangers\"</span><span class=\"token punctuation\">,</span> cursive<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 0.5em 0<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">button </span><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 1.2em<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 0.5em 1em<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">margin-bottom</span><span class=\"token punctuation\">:</span> 1em<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">cursor</span><span class=\"token punctuation\">:</span> pointer<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">font-family</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"Bangers\"</span><span class=\"token punctuation\">,</span> cursive<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">background</span><span class=\"token punctuation\">:</span> <span class=\"token function\">rgb</span><span class=\"token punctuation\">(</span>255<span class=\"token punctuation\">,</span> 240<span class=\"token punctuation\">,</span> 33<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token property\">transition</span><span class=\"token punctuation\">:</span> linear 0.2s<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">border</span><span class=\"token punctuation\">:</span> 1px solid black<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">box-shadow</span><span class=\"token punctuation\">:</span> 2px 2px black<span class=\"token punctuation\">;</span>\n\n  <span class=\"token selector\"><span class=\"token parent important\">&amp;</span>:hover </span><span class=\"token punctuation\">{</span>\n    <span class=\"token property\">transform</span><span class=\"token punctuation\">:</span> <span class=\"token function\">translate</span><span class=\"token punctuation\">(</span>-2px<span class=\"token punctuation\">,</span> -2px<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token property\">box-shadow</span><span class=\"token punctuation\">:</span> 4px 4px black<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token selector\"><span class=\"token parent important\">&amp;</span>.reset </span><span class=\"token punctuation\">{</span>\n    <span class=\"token property\">margin-left</span><span class=\"token punctuation\">:</span> 0.25em<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">background-color</span><span class=\"token punctuation\">:</span> white<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"scss\"><pre class=\"language-scss\"><code class=\"language-scss\"><span class=\"token comment\">// Characters.scss</span>\n\n<span class=\"token selector\">.characters </span><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">max-width</span><span class=\"token punctuation\">:</span> 80vw<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> 0 auto<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> grid<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">grid-template-columns</span><span class=\"token punctuation\">:</span> <span class=\"token function\">repeat</span><span class=\"token punctuation\">(</span>3<span class=\"token punctuation\">,</span> 1fr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token property\">grid-gap</span><span class=\"token punctuation\">:</span> 10px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 1em<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">background-color</span><span class=\"token punctuation\">:</span> white<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">background-image</span><span class=\"token punctuation\">:</span> <span class=\"token url\">url</span><span class=\"token punctuation\">(</span>../images/paper.jpg<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.characterCard </span><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 1em<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> flex<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">flex-direction</span><span class=\"token punctuation\">:</span> column<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">height</span><span class=\"token punctuation\">:</span> 300px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">border</span><span class=\"token punctuation\">:</span> 2px solid black<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">box-shadow</span><span class=\"token punctuation\">:</span> 4px 4px black<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">filter</span><span class=\"token punctuation\">:</span> <span class=\"token function\">grayscale</span><span class=\"token punctuation\">(</span>100<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token property\">transition</span><span class=\"token punctuation\">:</span> 0.2s linear<span class=\"token punctuation\">;</span>\n\n  <span class=\"token selector\">.caption </span><span class=\"token punctuation\">{</span>\n    <span class=\"token property\">font-family</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"Bangers\"</span><span class=\"token punctuation\">,</span> cursive<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 1.6em<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">text-align</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> auto auto 0 auto<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 0.5em 1em<span class=\"token punctuation\">;</span>\n\n    <span class=\"token property\">background-color</span><span class=\"token punctuation\">:</span> white<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">background-image</span><span class=\"token punctuation\">:</span> <span class=\"token url\">url</span><span class=\"token punctuation\">(</span>../images/paper.jpg<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token property\">border</span><span class=\"token punctuation\">:</span> 1px solid black<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">box-shadow</span><span class=\"token punctuation\">:</span> 2px 2px black<span class=\"token punctuation\">;</span>\n\n    <span class=\"token selector\"><span class=\"token parent important\">&amp;</span>.bottom </span><span class=\"token punctuation\">{</span>\n      <span class=\"token property\">position</span><span class=\"token punctuation\">:</span> absolute<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">bottom</span><span class=\"token punctuation\">:</span> 1rem<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">left</span><span class=\"token punctuation\">:</span> 50%<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">transform</span><span class=\"token punctuation\">:</span> <span class=\"token function\">translateX</span><span class=\"token punctuation\">(</span>-50%<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token property\">opacity</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token selector\"><span class=\"token parent important\">&amp;</span>:hover </span><span class=\"token punctuation\">{</span>\n    <span class=\"token property\">cursor</span><span class=\"token punctuation\">:</span> pointer<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">filter</span><span class=\"token punctuation\">:</span> <span class=\"token function\">grayscale</span><span class=\"token punctuation\">(</span>0<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token property\">box-shadow</span><span class=\"token punctuation\">:</span> 6px 6px black<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">transform</span><span class=\"token punctuation\">:</span> <span class=\"token function\">translate</span><span class=\"token punctuation\">(</span>-2px<span class=\"token punctuation\">,</span> -2px<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token selector\">.caption </span><span class=\"token punctuation\">{</span>\n      <span class=\"token property\">opacity</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token selector\">.bottom </span><span class=\"token punctuation\">{</span>\n      <span class=\"token property\">opacity</span><span class=\"token punctuation\">:</span> 1<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token atrule\"><span class=\"token rule\">@media</span> only screen <span class=\"token operator\">and</span> <span class=\"token punctuation\">(</span><span class=\"token property\">max-width</span><span class=\"token punctuation\">:</span> 800px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token selector\">.characters </span><span class=\"token punctuation\">{</span>\n    <span class=\"token property\">grid-template-columns</span><span class=\"token punctuation\">:</span> <span class=\"token function\">repeat</span><span class=\"token punctuation\">(</span>1<span class=\"token punctuation\">,</span> 1fr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"scss\"><pre class=\"language-scss\"><code class=\"language-scss\"><span class=\"token comment\">// Comics.scss</span>\n\n<span class=\"token selector\">.comics </span><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">max-width</span><span class=\"token punctuation\">:</span> 80vw<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> 0 auto<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> grid<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">grid-template-columns</span><span class=\"token punctuation\">:</span> <span class=\"token function\">repeat</span><span class=\"token punctuation\">(</span>5<span class=\"token punctuation\">,</span> 1fr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token property\">grid-gap</span><span class=\"token punctuation\">:</span> 10px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 1em<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">background-color</span><span class=\"token punctuation\">:</span> white<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">background-image</span><span class=\"token punctuation\">:</span> <span class=\"token url\">url</span><span class=\"token punctuation\">(</span>../images/paper.jpg<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.comicCard </span><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 1em<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> flex<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">flex-direction</span><span class=\"token punctuation\">:</span> column<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">height</span><span class=\"token punctuation\">:</span> 400px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">border</span><span class=\"token punctuation\">:</span> 2px solid black<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">box-shadow</span><span class=\"token punctuation\">:</span> 4px 4px black<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">filter</span><span class=\"token punctuation\">:</span> <span class=\"token function\">grayscale</span><span class=\"token punctuation\">(</span>100<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token property\">transition</span><span class=\"token punctuation\">:</span> 0.2s linear<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">text-decoration-color</span><span class=\"token punctuation\">:</span> black<span class=\"token punctuation\">;</span>\n\n  <span class=\"token selector\">.caption </span><span class=\"token punctuation\">{</span>\n    <span class=\"token property\">font-family</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"Bangers\"</span><span class=\"token punctuation\">,</span> cursive<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 1.6em<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">text-align</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> auto auto 0 auto<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 0.5em 1em<span class=\"token punctuation\">;</span>\n\n    <span class=\"token property\">background-color</span><span class=\"token punctuation\">:</span> white<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">background-image</span><span class=\"token punctuation\">:</span> <span class=\"token url\">url</span><span class=\"token punctuation\">(</span>../images/paper.jpg<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token property\">color</span><span class=\"token punctuation\">:</span> black<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">border</span><span class=\"token punctuation\">:</span> 1px solid black<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">box-shadow</span><span class=\"token punctuation\">:</span> 2px 2px black<span class=\"token punctuation\">;</span>\n\n    <span class=\"token selector\"><span class=\"token parent important\">&amp;</span>.bottom </span><span class=\"token punctuation\">{</span>\n      <span class=\"token property\">position</span><span class=\"token punctuation\">:</span> absolute<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">bottom</span><span class=\"token punctuation\">:</span> 1rem<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">left</span><span class=\"token punctuation\">:</span> 50%<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">transform</span><span class=\"token punctuation\">:</span> <span class=\"token function\">translateX</span><span class=\"token punctuation\">(</span>-50%<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token property\">opacity</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">color</span><span class=\"token punctuation\">:</span> black<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">text-decoration</span><span class=\"token punctuation\">:</span> underline<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 60%<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token selector\"><span class=\"token parent important\">&amp;</span>:hover </span><span class=\"token punctuation\">{</span>\n    <span class=\"token property\">cursor</span><span class=\"token punctuation\">:</span> pointer<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">filter</span><span class=\"token punctuation\">:</span> <span class=\"token function\">grayscale</span><span class=\"token punctuation\">(</span>0<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token property\">box-shadow</span><span class=\"token punctuation\">:</span> 6px 6px black<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">transform</span><span class=\"token punctuation\">:</span> <span class=\"token function\">translate</span><span class=\"token punctuation\">(</span>-2px<span class=\"token punctuation\">,</span> -2px<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token selector\">.caption </span><span class=\"token punctuation\">{</span>\n      <span class=\"token property\">opacity</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token selector\">.bottom </span><span class=\"token punctuation\">{</span>\n      <span class=\"token property\">opacity</span><span class=\"token punctuation\">:</span> 1<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token atrule\"><span class=\"token rule\">@media</span> only screen <span class=\"token operator\">and</span> <span class=\"token punctuation\">(</span><span class=\"token property\">max-width</span><span class=\"token punctuation\">:</span> 1200px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token selector\">.comics </span><span class=\"token punctuation\">{</span>\n    <span class=\"token property\">grid-template-columns</span><span class=\"token punctuation\">:</span> <span class=\"token function\">repeat</span><span class=\"token punctuation\">(</span>3<span class=\"token punctuation\">,</span> 1fr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token atrule\"><span class=\"token rule\">@media</span> only screen <span class=\"token operator\">and</span> <span class=\"token punctuation\">(</span><span class=\"token property\">max-width</span><span class=\"token punctuation\">:</span> 800px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token selector\">.comics </span><span class=\"token punctuation\">{</span>\n    <span class=\"token property\">grid-template-columns</span><span class=\"token punctuation\">:</span> <span class=\"token function\">repeat</span><span class=\"token punctuation\">(</span>1<span class=\"token punctuation\">,</span> 1fr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>You will also need to add a small chunk of CSS in your <code class=\"language-text\">index.css</code> file at the root of your project, to make sure your background and fonts are being properly displayed. Here is what my <code class=\"language-text\">index.css</code> looks like.</p>\n<div class=\"gatsby-highlight\" data-language=\"scss\"><pre class=\"language-scss\"><code class=\"language-scss\"><span class=\"token keyword\">@import</span> <span class=\"token url\">url</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"https://fonts.googleapis.com/css2?family=Bangers&amp;display=swap\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token selector\">body </span><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">background</span><span class=\"token punctuation\">:</span> <span class=\"token function\">linear-gradient</span><span class=\"token punctuation\">(</span>\n        45deg<span class=\"token punctuation\">,</span>\n        <span class=\"token function\">rgba</span><span class=\"token punctuation\">(</span>0<span class=\"token punctuation\">,</span> 110<span class=\"token punctuation\">,</span> 193<span class=\"token punctuation\">,</span> 0.3<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        <span class=\"token function\">rgba</span><span class=\"token punctuation\">(</span>0<span class=\"token punctuation\">,</span> 115<span class=\"token punctuation\">,</span> 138<span class=\"token punctuation\">,</span> 0.1<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">)</span> no-repeat fixed center<span class=\"token punctuation\">,</span> <span class=\"token url\">url</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"./images/spiderman.jpg\"</span><span class=\"token punctuation\">)</span> no-repeat fixed\n      center<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">background-size</span><span class=\"token punctuation\">:</span> cover<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>And with that our Marvel Comic Book app is finished. You can of course expand it with other interesting functionalities, such as bookmarking your favorite characters and comics that you want to read, or making a database of comics you already finished reading. You can also expand the search functionality to also include and directly search comic book names, or events that are connected to the Marvel universe (you can find these properties and endpoints in the API documentation). If you do end up improving this app send me a message. I would love to see your creations!</p>\n<hr>\n \n<div class=\"sectionHighlight\">If you have any questions or comments you can reach out to me on <a href=\"https://twitter.com/alekswritescode\" target=\"_blank\" rel=\"noopener noreferrer\">Twitter</a> and <a href=\"https://www.instagram.com/aleks.popovic/\" target=\"_blank\" rel=\"noopener noreferrer\">Instagram</a>, where I also post interesting code tidbits and designs.\n \nI also have a <a href=\"https://www.youtube.com/AleksPopovic\" target=\"_blank\" rel=\"noopener noreferrer\">YouTube channel</a> where I regularly upload React and web dev tutorials, so if that's your cup of tea feel free to support me by subscribing.</div>","frontmatter":{"title":"Comic Book App With Marvel API and React","series":null,"seriesLink":null,"date":"November 02, 2023","description":"I grew up on both DC and Marvel comic books, cartoons and TV shows. From the 1966 Batman series, to 1967 Spider man cartoons, and 1940s Superman cartoons. Which is sort of ridiculous since I grew up in the 90s, but I guess that's what our TV companies could afford at the time.","tags":["web","react","API"],"featuredImage":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAAsSAAALEgHS3X78AAAB80lEQVQY0wHoARf+AClYbwJFeiZpnmql12un1HGizIet3ktxphA6chFAdhU8eCJMhTdQiDZVjxJQih1TkB5FeD9SfD5Sg0BumAAoVGkOR3AQUYZekZlekIdwmY18lb1Yb506Wok2ZJRQeZVUhaViiadgi65YeZ1TX45FT3RdeJdjg7M/h8wAIFJ0FU13Om+ayM7Lp7a7q7jBu7vAtbe8hJmvZIiOqrJ7vbp1zsp1sKtsgH1jZW6DYGCMbH2wRmKSDE+LAEFtkTlqknWUr7S1vbS+zaq3x5ytwbG8xnmVs2yMiZ+lc6mpbq+nabitamZobFVsf1Fbei9WcyRIdRE7eABIcpM4Z446Zo5ohYyHoZaJpZedr5+MoKFuiZd3kop9knlykZCGmJSHkYKHioVfZoVee385XHclToUZSH0AQGqMKld/MmONq7N7vbNktq9lz8Rmh5yIiZ2GubVuy8Ruq6tpvr11vL6Bd4RzGkeEP2eYP2ebVXmWUnuZADFfhV6OuFOBpZiieJ+ofp2ke5mjgoOhoJeoiY2Wb5qiepagepufb4eZgjpjfyNYjTNxpC1mm0tupF59qQAkVX9ViLNglcBIfKlxqddonspmnMxckr5YjLQ6cJw+daMvZZMwZ5UtY45AdqMzaJQvZ5U6VY1EXpg6WZdFOOj9r+dRhAAAAABJRU5ErkJggg==","aspectRatio":2.6666666666666665,"src":"/static/9dc0ca21ac4035a31d6c67333000d87c/0e6e2/marvel.png","srcSet":"/static/9dc0ca21ac4035a31d6c67333000d87c/b460a/marvel.png 480w,\n/static/9dc0ca21ac4035a31d6c67333000d87c/6e898/marvel.png 960w,\n/static/9dc0ca21ac4035a31d6c67333000d87c/0e6e2/marvel.png 1920w","srcWebp":"/static/9dc0ca21ac4035a31d6c67333000d87c/30cf3/marvel.webp","srcSetWebp":"/static/9dc0ca21ac4035a31d6c67333000d87c/35871/marvel.webp 480w,\n/static/9dc0ca21ac4035a31d6c67333000d87c/fcc10/marvel.webp 960w,\n/static/9dc0ca21ac4035a31d6c67333000d87c/30cf3/marvel.webp 1920w","sizes":"(max-width: 1920px) 100vw, 1920px"}}}}}},"pageContext":{"slug":"/Comic-Book-App-With-Marvel-API-and-React/","previous":{"excerpt":"Sometimes you gotta do what you gotta do. For quite a while I’ve had this idea of making a radio player or an app which you could use to…","fields":{"slug":"/Radio-Player-App-in-React/"},"frontmatter":{"date":"March 09, 2021","title":"Radio Player App in React","series":null,"description":"Sometimes you gotta do what you gotta do. For quite a while I've had this idea of making a radio player or an app which you could use to search up or browse different radio stations, but something else always came first. The holidays, job, working on other projects, but I finally got around to doing it.","tags":["web","react"],"featuredImage":{"id":"34795a8f-328a-5a70-b319-055e7e3f80c9","publicURL":"/static/089090f649eaebf75d83fee9b0c1db68/radio.png","relativeDirectory":"Radio-Player-App-in-React","relativePath":"Radio-Player-App-in-React/radio.png"}}},"next":{"excerpt":"If you need a quick and simple solution for address search with autocomplete and geocoding this one is for you. To set up this project you…","fields":{"slug":"/Address-Search-With-React-and-Mapbox-API/"},"frontmatter":{"date":"November 09, 2023","title":"Address Search with React and Mapbox API","series":null,"description":"If you need a quick and simple solution for address search with autocomplete and geocoding this one is for you.","tags":["web","react","API"],"featuredImage":{"id":"ef200b89-aee2-5b99-81a2-7b8b0749b57b","publicURL":"/static/03b6810fd10b370c8aca9660ed18d330/address.png","relativeDirectory":"Address-Search-With-React-and-Mapbox-API","relativePath":"Address-Search-With-React-and-Mapbox-API/address.png"}}}}}}